home *** CD-ROM | disk | FTP | other *** search
/ 3D GFX / 3D GFX.iso / amiutils / m_p / povraywb / source.lzh / frame.h < prev    next >
C/C++ Source or Header  |  1995-01-30  |  27KB  |  1,077 lines

  1. /****************************************************************************
  2. *                   frame.h
  3. *
  4. *  This header file is included by all C modules in POV-Ray. It defines all
  5. *  globally-accessible types and constants.
  6. *
  7. *  from Persistence of Vision Raytracer
  8. *  Copyright 1993 Persistence of Vision Team
  9. *---------------------------------------------------------------------------
  10. *  NOTICE: This source code file is provided so that users may experiment
  11. *  with enhancements to POV-Ray and to port the software to platforms other 
  12. *  than those supported by the POV-Ray Team.  There are strict rules under
  13. *  which you are permitted to use this file.  The rules are in the file
  14. *  named POVLEGAL.DOC which should be distributed with this file. If 
  15. *  POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  16. *  Team Coordinator by leaving a message in CompuServe's Graphics Developer's
  17. *  Forum.  The latest version of POV-Ray may be found there as well.
  18. *
  19. * This program is based on the popular DKB raytracer version 2.12.
  20. * DKBTrace was originally written by David K. Buck.
  21. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  22. *
  23. *****************************************************************************/
  24.  
  25. /* Generic header for all modules */
  26.  
  27. #include <math.h>
  28. #ifdef _M68881
  29.   #include <m68881.h>
  30. #endif
  31. #include <stdio.h>
  32. #include <string.h>
  33. #include <limits.h>
  34. #include "config.h"
  35.  
  36.  
  37. /* These are used by POVRAY.C and the machine specific modules */
  38.  
  39. #define POV_RAY_VERSION "2.2"
  40.  
  41. /* This message is for the personal distribution release. */
  42. #define DISTRIBUTION_MESSAGE_1 "This is an unofficial version compiled by:"
  43. #define DISTRIBUTION_MESSAGE_2 "Frank Hoffmann (hoffmann@ls11.informatik.uni-dortmund.de)"
  44. #define DISTRIBUTION_MESSAGE_3 "The POV-Ray Team is not responsible for supporting this version."
  45.  
  46. #ifndef READ_ENV_VAR_BEFORE 
  47. #define READ_ENV_VAR_BEFORE 
  48. #endif
  49. #ifndef READ_ENV_VAR_AFTER
  50. #define READ_ENV_VAR_AFTER if ((Option_String_Ptr = getenv("POVRAYOPT")) != NULL) read_options(Option_String_Ptr);   
  51. #endif
  52.  
  53. #ifndef CONFIG_MATH
  54. #define CONFIG_MATH
  55. #endif
  56.  
  57. #ifndef EPSILON
  58. #define EPSILON 1.0e-10
  59. #endif
  60.  
  61. #ifndef FILE_NAME_LENGTH
  62. #define FILE_NAME_LENGTH 150
  63. #endif
  64.  
  65. #ifndef HUGE_VAL
  66. #define HUGE_VAL 1.0e+17
  67. #endif
  68.  
  69. #ifndef BOUND_HUGE
  70. #define BOUND_HUGE 1.0e30
  71. #endif
  72.  
  73. #ifndef DBL_FORMAT_STRING
  74. #define DBL_FORMAT_STRING "%lf"
  75. #endif
  76.  
  77. #ifndef DEFAULT_OUTPUT_FORMAT
  78. #define DEFAULT_OUTPUT_FORMAT    'd'
  79. #endif
  80.  
  81. #ifndef RED_RAW_FILE_EXTENSION
  82. #define RED_RAW_FILE_EXTENSION ".red"
  83. #endif
  84.  
  85. #ifndef GREEN_RAW_FILE_EXTENSION
  86. #define GREEN_RAW_FILE_EXTENSION ".grn"
  87. #endif
  88.  
  89. #ifndef BLUE_RAW_FILE_EXTENSION
  90. #define BLUE_RAW_FILE_EXTENSION ".blu"
  91. #endif
  92.  
  93. #ifndef FILENAME_SEPARATOR
  94. #define FILENAME_SEPARATOR "/"
  95. #endif
  96.  
  97. /* 0==yes 1==no 2==opt */
  98. #ifndef CASE_SENSITIVE_DEFAULT
  99. #define CASE_SENSITIVE_DEFAULT 0
  100. #endif
  101.  
  102. #ifndef READ_FILE_STRING
  103. #define READ_FILE_STRING "rb"
  104. #endif
  105.  
  106. #ifndef WRITE_FILE_STRING
  107. #define WRITE_FILE_STRING "wb"
  108. #endif
  109.  
  110. #ifndef APPEND_FILE_STRING
  111. #define APPEND_FILE_STRING "ab"
  112. #endif
  113.  
  114. #ifndef NORMAL
  115. #define NORMAL '0'
  116. #endif
  117.  
  118. #ifndef GREY
  119. #define GREY   'G'
  120. #endif
  121.  
  122. #ifndef START_TIME
  123. #define START_TIME time(&tstart);     
  124. #endif
  125.  
  126. #ifndef STOP_TIME
  127. #define STOP_TIME  time(&tstop);
  128. #endif
  129.  
  130. #ifndef TIME_ELAPSED
  131. #define TIME_ELAPSED difftime (tstop, tstart);
  132. #endif
  133.  
  134. #ifndef STARTUP_POVRAY
  135. #define STARTUP_POVRAY
  136. #endif
  137.  
  138. #ifndef PRINT_OTHER_CREDITS
  139. #define PRINT_OTHER_CREDITS
  140. #endif
  141.  
  142. #ifndef TEST_ABORT
  143. #define TEST_ABORT
  144. #endif
  145.  
  146. #ifndef FINISH_POVRAY
  147. #define FINISH_POVRAY
  148. #endif
  149.  
  150. #ifndef COOPERATE
  151. #define COOPERATE 
  152. #endif
  153.  
  154. #ifndef DBL
  155. #define DBL double
  156. #endif
  157.  
  158. #ifndef ACOS
  159. #define ACOS acos
  160. #endif
  161.  
  162. #ifndef SQRT
  163. #define SQRT sqrt
  164. #endif
  165.  
  166. #ifndef POW
  167. #define POW pow
  168. #endif
  169.  
  170. #ifndef COS
  171. #define COS cos
  172. #endif
  173.  
  174. #ifndef SIN
  175. #define SIN sin
  176. #endif
  177.  
  178. #ifndef labs
  179. #define labs(x) (long) ((x<0)?-x:x)
  180. #endif
  181.  
  182. #ifndef max
  183. #define max(x,y) ((x<y)?y:x)
  184. #endif
  185.  
  186. #ifndef STRLN
  187. #define STRLN(x) x
  188. #endif
  189.  
  190. #ifndef PARAMS
  191. #define PARAMS(x) x
  192. #endif
  193.  
  194. #ifndef ANSIFUNC
  195. #define ANSIFUNC 1
  196. #endif
  197.  
  198. #ifndef M_PI
  199. #define M_PI 3.1415926535897932384626
  200. #endif
  201.  
  202. #ifndef TRUE
  203. #define TRUE 1
  204. #define FALSE 0
  205. #endif
  206.  
  207. #ifndef IFF_SWITCH_CAST
  208. #define IFF_SWITCH_CAST (int)
  209. #endif
  210.  
  211. #ifndef PRINT_CREDITS
  212. #define PRINT_CREDITS print_credits();
  213. #endif
  214.  
  215. #ifndef PRINT_STATS
  216. #define PRINT_STATS print_stats();
  217. #endif
  218.  
  219. #ifndef MAX_CONSTANTS
  220. #define MAX_CONSTANTS 1000
  221. #endif
  222.  
  223. #ifndef WAIT_FOR_KEYPRESS
  224. #define WAIT_FOR_KEYPRESS
  225. #endif
  226.  
  227. #ifndef CDECL
  228. #define CDECL
  229. #endif
  230.  
  231. #ifndef MAX_BUFSIZE
  232. #define MAX_BUFSIZE INT_MAX
  233. #endif
  234.  
  235. /* If compiler version is undefined, then make it 'u' for unknown */
  236. #ifndef COMPILER_VER
  237. #define COMPILER_VER ".u"
  238. #endif
  239.  
  240. #ifndef QSORT_FUNCT_RET
  241. #define QSORT_FUNCT_RET int CDECL
  242. #endif
  243.  
  244. #ifndef QSORT_FUNCT_PARAM
  245. #define QSORT_FUNCT_PARAM void *
  246. #endif
  247.  
  248. #ifndef MAIN_RETURN_TYPE
  249. #define MAIN_RETURN_TYPE void
  250. #endif
  251.  
  252. #ifndef MAIN_RETURN_STATEMENT
  253. #define MAIN_RETURN_STATEMENT
  254. #endif
  255.  
  256. /* These values determine the minumum and maximum distances
  257.    that qualify as ray-object intersections */
  258. #define Small_Tolerance 0.001
  259. #define Max_Distance 1.0e7
  260.  
  261. typedef struct istk_entry INTERSECTION;
  262. typedef struct Vector_Struct VECTOR;
  263. typedef DBL MATRIX [4][4];
  264. typedef struct Bounding_Box_Struct BBOX;
  265. typedef struct Colour_Struct COLOUR;
  266. typedef struct Colour_Map_Entry COLOUR_MAP_ENTRY;
  267. typedef struct Colour_Map_Struct COLOUR_MAP;
  268. typedef struct Transform_Struct TRANSFORM;
  269. typedef struct Image_Struct IMAGE;
  270. typedef struct Texture_Struct TEXTURE;
  271. typedef struct Material_Texture_Struct MATERIAL;
  272. typedef struct Tiles_Texture_Struct TILES;
  273. typedef struct Pattern_Struct TPATTERN;
  274. typedef struct Pigment_Struct PIGMENT;
  275. typedef struct Tnormal_Struct TNORMAL;
  276. typedef struct Finish_Struct FINISH;
  277. typedef struct Method_Struct METHODS;
  278. typedef struct Camera_Struct CAMERA;
  279. typedef struct Object_Struct OBJECT;
  280. typedef struct Composite_Struct COMPOSITE;
  281. typedef struct Sphere_Struct SPHERE;
  282. typedef struct Quadric_Struct QUADRIC;
  283. typedef struct Poly_Struct POLY;
  284. typedef struct Disc_Struct DISC;
  285. typedef struct Cone_Struct CYLINDER;
  286. typedef struct Cone_Struct CONE;
  287. typedef struct Light_Source_Struct LIGHT_SOURCE;
  288. typedef struct Bicubic_Patch_Struct BICUBIC_PATCH;
  289. typedef struct Triangle_Struct TRIANGLE;
  290. typedef struct Smooth_Triangle_Struct SMOOTH_TRIANGLE;
  291. typedef struct Plane_Struct PLANE;
  292. typedef struct CSG_Struct CSG;
  293. typedef struct Box_Struct BOX;
  294. typedef struct Blob_Struct BLOB;
  295. typedef struct Ray_Struct RAY;
  296. typedef struct Frame_Struct FRAME;
  297. typedef struct istack_struct ISTACK;
  298. typedef int TOKEN;
  299. typedef int CONSTANT;
  300. typedef struct Chunk_Header_Struct CHUNK_HEADER;
  301. typedef struct Data_File_Struct DATA_FILE;
  302. typedef struct complex_block complex;
  303. typedef struct Height_Field_Struct HEIGHT_FIELD;
  304. /* typedef short WORD; */
  305.  
  306. struct Vector_Struct
  307.   {
  308.    DBL x, y, z;
  309.   };
  310. #define Destroy_Vector(x) if ((x)!=NULL) free(x)
  311. #define Destroy_Float(x) if ((x)!=NULL) free(x)
  312.  
  313. struct Colour_Struct
  314.   {
  315.    DBL Red, Green, Blue, Filter;
  316.   };
  317.  
  318. #define Make_Colour(c,r,g,b) {(c)->Red=(r);(c)->Green=(g);(c)->Blue=(b);(c)->Filter=0.0;}
  319. #define Make_ColourA(c,r,g,b,a) {(c)->Red=(r);(c)->Green=(g);(c)->Blue=(b);(c)->Filter=(a);}
  320. #define Make_Vector(v,a,b,c) { (v)->x=(a);(v)->y=(b);(v)->z=(c); }
  321. #define Destroy_Colour(x) if ((x)!=NULL) free(x)
  322. #define MAX_COLOUR_MAP_ENTRIES 40
  323.  
  324. struct Colour_Map_Entry
  325.   {
  326.    DBL value;
  327.    COLOUR Colour;
  328.   };
  329.  
  330. struct Colour_Map_Struct
  331.   {
  332.    int Number_Of_Entries, Transparency_Flag, Users;
  333.    COLOUR_MAP_ENTRY *Colour_Map_Entries;
  334.   };
  335.  
  336. struct Transform_Struct
  337.   {
  338.    MATRIX matrix;
  339.    MATRIX inverse;
  340.   };
  341.  
  342. #define Destroy_Transform(x) if ((x)!=NULL) free(x)
  343.  
  344. /* Types for reading IFF files. */
  345. typedef struct {unsigned short Red, Green, Blue, Filter;} IMAGE_COLOUR;
  346.  
  347. struct Image_Line
  348.   {
  349.    unsigned char *red, *green, *blue;
  350.   };
  351.  
  352. typedef struct Image_Line IMAGE_LINE;
  353.  
  354. /* Legal image attributes */
  355. #define GIF_FILE   1
  356. #define POT_FILE   2
  357. #define DUMP_FILE  4
  358. #define IFF_FILE   8
  359. #define TGA_FILE  16
  360. #define GRAD_FILE 32
  361. #define PBM_FILE  64
  362.  
  363. #define IMAGE_FILE    GIF_FILE+DUMP_FILE+IFF_FILE+GRAD_FILE+TGA_FILE+PBM_FILE
  364. #define NORMAL_FILE   GIF_FILE+DUMP_FILE+IFF_FILE+GRAD_FILE+TGA_FILE+PBM_FILE
  365. #define MATERIAL_FILE GIF_FILE+DUMP_FILE+IFF_FILE+GRAD_FILE+TGA_FILE+PBM_FILE
  366. #define HF_FILE       GIF_FILE+POT_FILE+TGA_FILE
  367.  
  368. struct Image_Struct
  369.   {
  370.    int Map_Type;
  371.    int File_Type;
  372.    int Interpolation_Type;
  373.    short Once_Flag;
  374.    short Use_Colour_Flag;
  375.    VECTOR Gradient;
  376.    DBL width, height;
  377.    int iwidth, iheight;
  378.    short Colour_Map_Size;
  379.    IMAGE_COLOUR *Colour_Map;
  380.    union 
  381.     {
  382.      IMAGE_LINE *rgb_lines;
  383.      unsigned char **map_lines;
  384.     } data;  
  385.   };
  386.  
  387. /* Texture types */
  388. #define PNF_TEXTURE     0
  389. #define TILE_TEXTURE    1
  390. #define MAT_TEXTURE     2
  391.  
  392. /* Image/Bump Map projection types */
  393. #define PLANAR_MAP      0
  394. #define SPHERICAL_MAP   1
  395. #define CYLINDRICAL_MAP 2
  396. #define PARABOLIC_MAP   3
  397. #define HYPERBOLIC_MAP  4
  398. #define TORUS_MAP       5
  399. #define PIRIFORM_MAP    6
  400. #define OLD_MAP         7
  401.  
  402. /* Bit map interpolation types */
  403. #define NO_INTERPOLATION 0
  404. #define NEAREST_NEIGHBOR 1
  405. #define BILINEAR         2
  406. #define CUBIC_SPLINE     3
  407. #define NORMALIZED_DIST  4
  408.  
  409. /* Coloration pigment list */
  410. #define NO_PIGMENT               0
  411. #define COLOUR_PIGMENT           1
  412. #define BOZO_PIGMENT             2
  413. #define MARBLE_PIGMENT           3
  414. #define WOOD_PIGMENT             4
  415. #define CHECKER_PIGMENT          5
  416. #define SPOTTED_PIGMENT          6
  417. #define AGATE_PIGMENT            7
  418. #define GRANITE_PIGMENT          8
  419. #define GRADIENT_PIGMENT         9
  420. #define IMAGE_MAP_PIGMENT       10
  421. #define PAINTED1_PIGMENT        11 
  422. #define PAINTED2_PIGMENT        12 
  423. #define PAINTED3_PIGMENT        13 
  424. #define ONION_PIGMENT           14 
  425. #define LEOPARD_PIGMENT         15 
  426. #define BRICK_PIGMENT           16
  427. #define MANDEL_PIGMENT          17
  428. #define HEXAGON_PIGMENT         18
  429. #define RADIAL_PIGMENT          19
  430.  
  431.  
  432. /* Normal perturbation (bumpy) texture list  */
  433. #define NO_NORMAL  0
  434. #define WAVES      1
  435. #define RIPPLES    2
  436. #define WRINKLES   3
  437. #define BUMPS      4
  438. #define DENTS      5
  439. #define BUMPY1     6
  440. #define BUMPY2     7
  441. #define BUMPY3     8
  442. #define BUMP_MAP   9
  443.  
  444. /* Pattern flags */
  445. #define NO_FLAGS      0
  446. #define HAS_FILTER    1
  447. #define FULL_BLOCKING 2
  448. #define HAS_TURB      4
  449. #define POST_DONE     8
  450.  
  451. #define TPATTERN_FIELDS int Type, Octaves, Flags; VECTOR Turbulence;  \
  452.   DBL omega, lambda, Frequency, Phase; IMAGE *Image; TRANSFORM *Trans;
  453.  
  454. #define INIT_TPATTERN_FIELDS(p,t) p->Type=t; p->Octaves=6; p->Image=NULL; \
  455.  p->Frequency=1.0; p->Phase=0.0;\
  456.  p->Trans=NULL; p->Flags=NO_FLAGS; p->omega=0.5;p->lambda=2.0; \
  457.  Make_Vector(&(p->Turbulence),0.0,0.0,0.0);
  458.  
  459. /* This is an abstract structure that is never actually used.
  460.    Pigment and Tnormal are descendents of this primative type */
  461.  
  462. struct Pattern_Struct
  463.   {
  464.    TPATTERN_FIELDS
  465.   };
  466.  
  467. struct Pigment_Struct
  468.   {
  469.    TPATTERN_FIELDS
  470.    COLOUR *Colour1;
  471.    COLOUR Quick_Colour;
  472.    COLOUR_MAP *Colour_Map;
  473.    VECTOR Colour_Gradient;
  474.    DBL Mortar, Agate_Turb_Scale;
  475.    int Iterations; /* mhs 10/92 for fractal textures */
  476.   };
  477.  
  478. struct Tnormal_Struct
  479.   {
  480.    TPATTERN_FIELDS
  481.    DBL Amount;
  482.   };
  483.  
  484. struct Finish_Struct
  485.   {
  486.    DBL Reflection, Ambient, Diffuse, Brilliance, Index_Of_Refraction;
  487.    DBL Refraction, Specular, Roughness, Phong, Phong_Size;
  488.    DBL Crand;
  489.    short Metallic_Flag;
  490.   };
  491.  
  492. #define Destroy_Finish(x) if ((x)!=NULL) free(x)
  493.  
  494. #define TEXTURE_FIELDS unsigned char Type,Flags; TEXTURE *Next_Material; \
  495.  TEXTURE *Next_Layer;
  496. #define TRANS_TEXTURE_FIELDS TEXTURE_FIELDS TRANSFORM *Trans;
  497.  
  498. struct Texture_Struct
  499.   {
  500.    TEXTURE_FIELDS
  501.    PIGMENT *Pigment;
  502.    TNORMAL *Tnormal;
  503.    FINISH *Finish;
  504.   };
  505.  
  506. struct Tiles_Texture_Struct
  507.   {
  508.    TRANS_TEXTURE_FIELDS
  509.    TEXTURE *Tile1;
  510.    TEXTURE *Tile2;
  511.   };
  512.  
  513. struct Material_Texture_Struct
  514.   {
  515.    TRANS_TEXTURE_FIELDS
  516.    TEXTURE *Materials;
  517.    IMAGE *Image;
  518.    int Num_Of_Mats;
  519.   };
  520.  
  521. /* Object types */
  522. #define BASIC_OBJECT            0
  523. #define PATCH_OBJECT            1   /* Has no inside, no inverse */
  524. #define TEXTURED_OBJECT         2   /* Has texture, possibly in children */
  525.  
  526. #define CHILDREN_FLAGS (PATCH_OBJECT+TEXTURED_OBJECT)
  527.                                     /* Reverse inherited flags */
  528.  
  529. #define COMPOUND_OBJECT         4   /* Has children field */
  530. #define STURM_OK_OBJECT         8   /* STRUM legal */
  531. #define WATER_LEVEL_OK_OBJECT  16   /* WATER_LEVEL legal */
  532. #define LIGHT_SOURCE_OBJECT    32   /* link me in frame.light_sources */
  533. #define BOUNDING_OBJECT        64   /* This is a holder for bounded object */
  534. #define SMOOTH_OK_OBJECT      128   /* SMOOTH legal */
  535. #define IS_CHILD_OBJECT       256   /* Object is inside a COMPOUND */
  536. #define DOUBLE_ILLUMINATE     512   /* Illuminate both sides of surface to
  537.                                        avoid normal purturb bug */
  538.  
  539. #define COMPOSITE_OBJECT       (BOUNDING_OBJECT)
  540. #define SPHERE_OBJECT          (BASIC_OBJECT)
  541. #define PLANE_OBJECT           (BASIC_OBJECT)
  542. #define QUADRIC_OBJECT         (BASIC_OBJECT)
  543. #define BOX_OBJECT             (BASIC_OBJECT)
  544. #define CONE_OBJECT            (BASIC_OBJECT)
  545. #define DISC_OBJECT            (BASIC_OBJECT)
  546. #define HEIGHT_FIELD_OBJECT    (BASIC_OBJECT+WATER_LEVEL_OK_OBJECT+SMOOTH_OK_OBJECT)
  547. #define TRIANGLE_OBJECT        (PATCH_OBJECT)
  548. #define SMOOTH_TRIANGLE_OBJECT (PATCH_OBJECT+DOUBLE_ILLUMINATE)
  549. #define BICUBIC_PATCH_OBJECT   (PATCH_OBJECT+DOUBLE_ILLUMINATE)
  550. #define UNION_OBJECT           (COMPOUND_OBJECT)
  551. #define MERGE_OBJECT           (COMPOUND_OBJECT)
  552. #define INTERSECTION_OBJECT    (COMPOUND_OBJECT)
  553. #define CUBIC_OBJECT           (STURM_OK_OBJECT)
  554. #define QUARTIC_OBJECT         (STURM_OK_OBJECT)
  555. #define POLY_OBJECT            (STURM_OK_OBJECT)
  556. #define BLOB_OBJECT            (STURM_OK_OBJECT)
  557. #define LIGHT_OBJECT           (COMPOUND_OBJECT+PATCH_OBJECT+LIGHT_SOURCE_OBJECT)
  558.  
  559. typedef int (*ALL_INTERSECTIONS_METHOD)PARAMS((OBJECT *, RAY *, ISTACK *));
  560. typedef int (*INSIDE_METHOD)PARAMS((VECTOR *, OBJECT *));
  561. typedef void (*NORMAL_METHOD)PARAMS((VECTOR *, OBJECT *, VECTOR *));
  562. typedef void *(*COPY_METHOD)PARAMS((OBJECT *));
  563. typedef void (*TRANSLATE_METHOD)PARAMS((OBJECT *, VECTOR *));
  564. typedef void (*ROTATE_METHOD)PARAMS((OBJECT *, VECTOR *));
  565. typedef void (*SCALE_METHOD)PARAMS((OBJECT *, VECTOR *));
  566. typedef void (*TRANSFORM_METHOD)PARAMS((OBJECT *, TRANSFORM *));
  567. typedef void (*INVERT_METHOD)PARAMS((OBJECT *));
  568. typedef void (*DESTROY_METHOD)PARAMS((OBJECT *));
  569.  
  570. struct Method_Struct
  571.   {
  572.    ALL_INTERSECTIONS_METHOD All_Intersections_Method;
  573.    INSIDE_METHOD Inside_Method;
  574.    NORMAL_METHOD Normal_Method;
  575.    COPY_METHOD Copy_Method;
  576.    TRANSLATE_METHOD Translate_Method;
  577.    ROTATE_METHOD Rotate_Method;
  578.    SCALE_METHOD Scale_Method;
  579.    TRANSFORM_METHOD Transform_Method;
  580.    INVERT_METHOD Invert_Method;
  581.    DESTROY_METHOD Destroy_Method;
  582.   };
  583.  
  584. #define All_Intersections(x,y,z) ((*((x)->Methods->All_Intersections_Method)) (x,y,z))
  585. #define Inside(x,y) ((*((y)->Methods->Inside_Method)) (x,y))
  586. #define Normal(x,y,z) ((*((y)->Methods->Normal_Method)) (x,y,z))
  587. #define Copy(x) ((*((x)->Methods->Copy_Method)) (x))
  588. #define Translate(x,y) ((*((x)->Methods->Translate_Method)) (x,y))
  589. #define Scale(x,y) ((*((x)->Methods->Scale_Method)) (x,y))
  590. #define Rotate(x,y) ((*((x)->Methods->Rotate_Method)) (x,y))
  591. #define Transform(x,y) ((*((x)->Methods->Transform_Method)) (x,y))
  592. #define Invert(x) ((*((x)->Methods->Invert_Method)) (x))
  593. #define Destroy(x) ((*((x)->Methods->Destroy_Method)) (x))
  594.  
  595. #define Destroy_Camera(x) if ((x)!=NULL) free(x)
  596.  
  597. struct Camera_Struct
  598.   {
  599.    VECTOR Location;
  600.    VECTOR Direction;
  601.    VECTOR Up;
  602.    VECTOR Right;
  603.    VECTOR Sky;
  604.   };
  605.  
  606. struct Bounding_Box_Struct {
  607.    VECTOR Lower_Left, Lengths;
  608.    };
  609.  
  610. /* These fields are common to all objects */
  611.  
  612. #define OBJECT_FIELDS \
  613.  METHODS *Methods;\
  614.  int Type;\
  615.  OBJECT *Sibling;\
  616.  TEXTURE *Texture;\
  617.  OBJECT *Bound;\
  618.  OBJECT *Clip;\
  619.  BBOX Bounds;\
  620.  short No_Shadow_Flag;
  621.  
  622. /* These fields are common to all compound objects */
  623. #define COMPOUND_FIELDS \
  624.  OBJECT_FIELDS \
  625.  OBJECT *Children;
  626.  
  627. #define INIT_OBJECT_FIELDS(o,t,m)\
  628.  o->Type=t;o->Methods= m;o->Sibling=NULL;o->Texture=NULL;\
  629.  o->Bound=NULL;o->Clip=NULL;o->No_Shadow_Flag=FALSE;\
  630.  Make_Vector(&o->Bounds.Lower_Left, -BOUND_HUGE/2, -BOUND_HUGE/2, -BOUND_HUGE/2)\
  631.  Make_Vector(&o->Bounds.Lengths, BOUND_HUGE, BOUND_HUGE, BOUND_HUGE)
  632.  
  633. /* This is an abstract structure that is never actually used.
  634.    All other objects are descendents of this primative type */
  635.  
  636. struct Object_Struct
  637.   {
  638.    OBJECT_FIELDS
  639.   };
  640.  
  641. struct CSG_Struct
  642.   {
  643.    COMPOUND_FIELDS
  644.   };
  645.  
  646. struct Light_Source_Struct
  647.   {
  648.    COMPOUND_FIELDS
  649.    COLOUR Colour;
  650.    VECTOR Center, Points_At, Axis1, Axis2;
  651.    DBL Coeff, Radius, Falloff;
  652.    LIGHT_SOURCE *Next_Light_Source;
  653.    unsigned char Light_Type, Area_Light, Jitter, Track;
  654.    int    Area_Size1, Area_Size2;
  655.    int    Adaptive_Level;
  656.    COLOUR **Light_Grid;
  657.    OBJECT *Shadow_Cached_Object;
  658.   };
  659.  
  660. /* Light source types */
  661. #define POINT_SOURCE     1
  662. #define SPOT_SOURCE      2
  663.  
  664. #define BUNCHING_FACTOR 4
  665. struct Composite_Struct
  666.   {
  667.    OBJECT_FIELDS
  668.    unsigned short int Entries;
  669.    OBJECT *Objects[BUNCHING_FACTOR];
  670.   };
  671.  
  672. struct Sphere_Struct
  673.   {
  674.    OBJECT_FIELDS
  675.    TRANSFORM *Trans; 
  676.    VECTOR  Center;
  677.    DBL     Radius;
  678.    DBL     Radius_Squared;
  679.    DBL     Inverse_Radius;
  680.    VECTOR  CMOtoC;
  681.    DBL     CMOCSquared;
  682.    short   CMinside, CMCached, Inverted;
  683.   };
  684.  
  685. struct Quadric_Struct
  686.   {
  687.    OBJECT_FIELDS
  688.    VECTOR  Square_Terms;
  689.    VECTOR  Mixed_Terms;
  690.    VECTOR  Terms;
  691.    DBL Constant;
  692.    DBL CM_Constant;
  693.    short Constant_Cached;
  694.    short Non_Zero_Square_Term;
  695.   };
  696.  
  697. typedef unsigned short HF_val;
  698.  
  699. typedef struct {
  700.    HF_val min_y, max_y;
  701. } HF_BLOCK;
  702.  
  703. typedef struct {
  704.         float x, z;
  705.         VECTOR normal;
  706. } Cached_Normals;
  707.  
  708. typedef short HF_Normals[3];
  709. #define HF_CACHE_SIZE 16
  710. #define LOWER_TRI 0
  711. #define UPPER_TRI 1
  712.  
  713.  
  714.  
  715. struct Height_Field_Struct
  716.   {
  717.    OBJECT_FIELDS 
  718.    TRANSFORM *Trans; 
  719.    BOX *bounding_box;
  720.    DBL Block_Size;
  721.    DBL Inv_Blk_Size;
  722.    HF_BLOCK **Block;
  723.    HF_val **Map;
  724.    int Inverted;
  725.    int cache_pos;
  726.    Cached_Normals Normal_Vector[HF_CACHE_SIZE];
  727.    int Smoothed;
  728.    HF_Normals **Normals;
  729.    };
  730.  
  731. struct Box_Struct
  732.   {
  733.    OBJECT_FIELDS 
  734.    TRANSFORM *Trans; 
  735.    VECTOR bounds[2];
  736.    short Inverted;
  737.   };
  738.  
  739. #define MAX_ORDER 15
  740.  
  741. #define STURM_FIELDS  OBJECT_FIELDS int Sturm_Flag;
  742.  
  743. /* Number of coefficients of a three variable polynomial of order x */
  744. #define term_counts(x) (((x)+1)*((x)+2)*((x)+3)/6)
  745.  
  746. struct Poly_Struct
  747.   {
  748.    STURM_FIELDS
  749.    TRANSFORM *Trans;
  750.    short Inverted;
  751.    int Order;
  752.    DBL *Coeffs;
  753.   };
  754.  
  755. struct Disc_Struct {
  756.    OBJECT_FIELDS
  757.    TRANSFORM *Trans; /* Transformation of a Disc object */
  758.    VECTOR center;    /* Center of the disc */
  759.    VECTOR normal;    /* Direction perpendicular to the disc (plane normal) */
  760.    DBL d;            /* The constant part of the plane equation */
  761.    DBL iradius2;     /* Distance from center to inner circle of the disc */
  762.    DBL oradius2;     /* Distance from center to outer circle of the disc */
  763.    short Inverted;
  764.    };
  765.  
  766. struct Cone_Struct {
  767.    OBJECT_FIELDS
  768.    TRANSFORM *Trans;   /* Transformation of a Cone object */
  769.    short int cyl_flag; /* Is this a cone or a cylinder? */
  770.    short int closed;   /* Currently unused - for making caps on the cone */
  771.    VECTOR apex;        /* Center of the top of the cone */
  772.    VECTOR base;        /* Center of the bottom of the cone */
  773.    DBL apex_radius;    /* Radius of the cone at the top */
  774.    DBL base_radius;    /* Radius of the cone at the bottom */
  775.    DBL dist;           /* Distance to end of cone in canonical coords */
  776.    short Inverted;
  777.    };
  778.  
  779. typedef struct Bezier_Node_Struct BEZIER_NODE;
  780. typedef struct Bezier_Child_Struct BEZIER_CHILDREN;
  781. typedef struct Bezier_Vertices_Struct BEZIER_VERTICES;
  782.  
  783. struct Bezier_Child_Struct
  784.   {
  785.    BEZIER_NODE *Children[4];
  786.   };
  787.  
  788. struct Bezier_Vertices_Struct
  789.   {
  790.    float uvbnds[4];
  791.    VECTOR Vertices[4];
  792.   };
  793.  
  794. struct Bezier_Node_Struct
  795.   {
  796.    int Node_Type;      /* Is this an interior node, or a leaf */
  797.    VECTOR Center;      /* Center of sphere bounding the (sub)patch */
  798.    DBL Radius_Squared; /* Radius of bounding sphere (squared) */
  799.    int Count;          /* # of subpatches associated with this node */
  800.    void *Data_Ptr;     /* Either pointer to vertices or pointer to children */
  801.   };
  802.  
  803. #define BEZIER_INTERIOR_NODE 0
  804. #define BEZIER_LEAF_NODE 1
  805.  
  806. #define MAX_PATCH_TYPE 4
  807.  
  808. struct Bicubic_Patch_Struct
  809.   {
  810.    OBJECT_FIELDS
  811.    int Patch_Type, U_Steps, V_Steps;
  812.    VECTOR Control_Points[4][4];
  813.    VECTOR Bounding_Sphere_Center;
  814.    DBL Bounding_Sphere_Radius;
  815.    DBL Flatness_Value;
  816.    BEZIER_NODE *Node_Tree;
  817.   };
  818.    
  819. #define X_AXIS 0
  820. #define Y_AXIS 1
  821. #define Z_AXIS 2
  822.  
  823. struct Triangle_Struct
  824.   {
  825.    OBJECT_FIELDS
  826.    VECTOR  Normal_Vector;
  827.    DBL     Distance;
  828.    DBL     CMNormDotOrigin;
  829.    unsigned int  CMCached:1;
  830.    unsigned int  Dominant_Axis:2;
  831.    unsigned int  vAxis:2;  /* used only for smooth triangles */
  832.    VECTOR  P1, P2, P3;
  833.    short int Degenerate_Flag;
  834.   };
  835.  
  836. struct Smooth_Triangle_Struct
  837.   {
  838.    OBJECT_FIELDS
  839.    VECTOR  Normal_Vector;
  840.    DBL     Distance;
  841.    DBL     CMNormDotOrigin;
  842.    unsigned int  CMCached:1;
  843.    unsigned int  Dominant_Axis:2;
  844.    unsigned int  vAxis:2;         /* used only for smooth triangles */
  845.    VECTOR  P1, P2, P3;
  846.    short int Degenerate_Flag;
  847.    VECTOR  N1, N2, N3, Perp;
  848.    DBL  BaseDelta;
  849.   };
  850.  
  851. struct Plane_Struct
  852.   {
  853.    OBJECT_FIELDS
  854.    VECTOR  Normal_Vector;
  855.    DBL     Distance;
  856.    DBL     CMNormDotOrigin;
  857.    int     CMCached;
  858.   };
  859.  
  860. typedef struct {
  861.    VECTOR pos;
  862.    DBL radius2;
  863.    DBL coeffs[3];
  864.    DBL tcoeffs[5];
  865.    } Blob_Element;
  866.  
  867. typedef struct blob_list_struct *blobstackptr;
  868. struct blob_list_struct {
  869.    Blob_Element elem;
  870.    blobstackptr next;
  871.    };
  872.  
  873. typedef struct {
  874.    int type, index;
  875.    DBL bound;
  876.    } Blob_Interval;
  877.  
  878. struct Blob_Struct
  879.    {
  880.    STURM_FIELDS
  881.    TRANSFORM *Trans;
  882.    short Inverted;
  883.    int count;
  884.    DBL threshold;
  885.    Blob_Element **list;
  886.    Blob_Interval *intervals;
  887. };
  888.  
  889. #define MAX_CONTAINING_OBJECTS 10
  890.  
  891. struct Ray_Struct
  892.   {
  893.    VECTOR Initial;               /*  Xo  Yo  Zo  */
  894.    VECTOR Direction;             /*  Xv  Yv  Zv  */
  895.    VECTOR Initial_2;             /*  Xo^2  Yo^2  Zo^2  */
  896.    VECTOR Direction_2;           /*  Xv^2  Yv^2  Zv^2  */
  897.    VECTOR Initial_Direction;     /*  XoXv  YoYv  ZoZv  */
  898.    VECTOR Mixed_Initial_Initial; /*  XoYo  XoZo  YoZo  */
  899.    VECTOR Mixed_Dir_Dir;         /*  XvYv  XvZv  YvZv  */
  900.    VECTOR Mixed_Init_Dir;        /*  XoYv+XvYo  XoZv+XvZo  YoZv+YvZo  */
  901.    int Containing_Index;
  902.    TEXTURE *Containing_Textures [MAX_CONTAINING_OBJECTS];
  903.    DBL Containing_IORs [MAX_CONTAINING_OBJECTS];
  904.    int Quadric_Constants_Cached;
  905.   };
  906.  
  907. struct Frame_Struct
  908.   {
  909.    CAMERA *Camera;
  910.    int Screen_Height, Screen_Width;
  911.    LIGHT_SOURCE *Light_Sources;
  912.    OBJECT *Objects;
  913.    DBL Atmosphere_IOR, Antialias_Threshold;
  914.    DBL Fog_Distance;
  915.    COLOUR Fog_Colour;
  916.    COLOUR Background_Colour;
  917.   };
  918.  
  919. #define DISPLAY 1
  920. #define VERBOSE 2
  921. #define DISKWRITE 4
  922. #define PROMPTEXIT 8
  923. #define ANTIALIAS 16
  924. #define DEBUGGING 32
  925. #define RGBSEPARATE 64
  926. #define EXITENABLE 128
  927. #define CONTINUE_TRACE 256
  928. #define VERBOSE_FILE 512
  929. #define JITTER 1024
  930.  
  931. /* Definitions for ISTACK structure */
  932.  
  933. struct istk_entry
  934.   {
  935.    DBL Depth;
  936.    VECTOR IPoint;
  937.    VECTOR INormal;
  938.    int NFlag;
  939.    OBJECT *Object;
  940.   };
  941.  
  942. struct istack_struct
  943.   {
  944.    struct istack_struct *next;
  945.    struct istk_entry *istack;
  946.    unsigned int top_entry;
  947.   };
  948.  
  949. #define itop(i) i->istack[i->top_entry]
  950. #define push_entry(d,v,o,i) itop(i).Depth=d; itop(i).IPoint=v; \
  951.  itop(i).NFlag=0; itop(i).Object=o; incstack(i);
  952. #define push_normal_entry(d,v,n,o,i) itop(i).Depth=d; itop(i).IPoint=v; \
  953.  itop(i).INormal=n; itop(i).NFlag=1; itop(i).Object=o; incstack(i);
  954. #define push_copy(i,e) itop(i)= *e; incstack(i);
  955. #define pop_entry(i) (i->top_entry > 0)?&(i->istack[--i->top_entry]):NULL
  956.  
  957. #define MAX_STRING_INDEX 41 
  958.  
  959. struct Reserved_Word_Struct
  960.   {
  961.    TOKEN Token_Number;
  962.    char *Token_Name;
  963.   };
  964.  
  965. /* Here's where you dump the information on the current token (fm. PARSE.C) */
  966.  
  967. struct Token_Struct
  968.   {
  969.    TOKEN Token_Id;
  970.    int Token_Line_No;
  971.    char *Token_String;
  972.    DBL Token_Float;
  973.    TOKEN Begin_Id;
  974.    int Constant_Index;
  975.    int Unget_Token, End_Of_File;
  976.    char *Filename, *Constant_Data;
  977.   };
  978.  
  979. /* Types of constants allowed in DECLARE statement (fm. PARSE.C) */
  980.  
  981. #define COLOUR_CONSTANT         0
  982. #define VECTOR_CONSTANT         1
  983. #define FLOAT_CONSTANT          2
  984. #define PIGMENT_CONSTANT        3
  985. #define TNORMAL_CONSTANT        4
  986. #define FINISH_CONSTANT         5
  987. #define TEXTURE_CONSTANT        6
  988. #define OBJECT_CONSTANT         7
  989. #define COLOUR_MAP_CONSTANT     8
  990. #define TRANSFORM_CONSTANT      9
  991. #define CAMERA_CONSTANT        10
  992.  
  993. /* CSG types */
  994. #define CSG_UNION_TYPE             1
  995. #define CSG_INTERSECTION_TYPE      2
  996. #define CSG_DIFFERENCE_TYPE        4
  997. #define CSG_MERGE_TYPE             8
  998. #define CSG_SINGLE_TYPE           16
  999.  
  1000. struct Constant_Struct
  1001.   {
  1002.    int Identifier_Number;
  1003.    CONSTANT Constant_Type;
  1004.    char *Constant_Data;
  1005.   };
  1006.  
  1007. struct Chunk_Header_Struct 
  1008.   {
  1009.    long name;
  1010.    long size;
  1011.   };
  1012.  
  1013. struct Data_File_Struct 
  1014.   {
  1015.    FILE *File;
  1016.    char *Filename;
  1017.    int Line_Number;
  1018.   };
  1019.  
  1020. struct complex_block 
  1021.   {
  1022.    DBL r, c;
  1023.   };
  1024.  
  1025. #define READ_MODE 0
  1026. #define WRITE_MODE 1
  1027. #define APPEND_MODE 2
  1028.  
  1029. struct file_handle_struct 
  1030.   {
  1031.    char *filename;
  1032.    int  mode;
  1033.    int width, height;
  1034.    int buffer_size;
  1035.    char *buffer;
  1036.    FILE *file;
  1037.    char *(*Default_File_Name_p) PARAMS((void));
  1038.    int  (*Open_File_p) PARAMS((struct file_handle_struct *handle,
  1039.            char *name, int *width, int *height, int buffer_size,
  1040.            int mode));
  1041.    void (*Write_Line_p) PARAMS((struct file_handle_struct *handle,
  1042.            COLOUR *line_data, int line_number));
  1043.    int  (*Read_Line_p) PARAMS((struct file_handle_struct *handle,
  1044.            COLOUR *line_data, int *line_number));
  1045.    void (*Read_Image_p) PARAMS((IMAGE *Image, char *filename));
  1046.    void (*Close_File_p) PARAMS((struct file_handle_struct *handle));
  1047.   };
  1048.  
  1049. typedef struct file_handle_struct FILE_HANDLE;
  1050.  
  1051. #define Default_File_Name(h) ((*((h)->Default_File_Name_p)) ())
  1052. #define Open_File(h,n,wd,ht,sz,m) ((*((h)->Open_File_p)) (h,n,wd,ht,sz,m))
  1053. #define Write_Line(h,l,n) ((*((h)->Write_Line_p)) (h, l, n))
  1054. #define Read_Line(h,l,n) ((*((h)->Read_Line_p)) (h, l, n))
  1055. #define Read_Image(h,i) ((*((h)->Read_Image_p)) (h, i))
  1056. #define Close_File(h) ((*((h)->Close_File_p)) (h))
  1057.  
  1058.  
  1059. #define Q_FULL_AMBIENT 1
  1060. #define Q_QUICKC       2
  1061. #define Q_SHADOW       4
  1062. #define Q_AREA_LIGHT   8
  1063. #define Q_REFRACT     16
  1064. #define Q_REFLECT     32
  1065. #define Q_NORMAL      64
  1066.  
  1067. #define QUALITY_0 Q_QUICKC+Q_FULL_AMBIENT
  1068. #define QUALITY_1 QUALITY_0
  1069. #define QUALITY_2 QUALITY_1-Q_FULL_AMBIENT
  1070. #define QUALITY_3 QUALITY_2
  1071. #define QUALITY_4 QUALITY_3+Q_SHADOW
  1072. #define QUALITY_5 QUALITY_4+Q_AREA_LIGHT
  1073. #define QUALITY_6 QUALITY_5-Q_QUICKC+Q_REFRACT
  1074. #define QUALITY_7 QUALITY_6
  1075. #define QUALITY_8 QUALITY_7+Q_REFLECT+Q_NORMAL
  1076. #define QUALITY_9 QUALITY_8
  1077.